home *** CD-ROM | disk | FTP | other *** search
- /*
- * hosts.h Copyright (C) 1992 Drew Eckhardt
- * mid to low-level SCSI driver interface header by
- * Drew Eckhardt
- *
- * <drew@colorado.edu>
- *
- * Modified by Eric Youngdale eric@tantalus.nrl.navy.mil to
- * add scatter-gather, multiple outstanding request, and other
- * enhancements.
- *
- * Further modified by Eric Youngdale to support multiple host adapters
- * of the same type.
- */
-
- #ifndef _HOSTS_H
- #define _HOSTS_H
-
- /*
- $Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/hosts.h,v 1.3 1993/09/24 12:21:00 drew Exp drew $
- */
-
-
- /* A jumpstart is often required when the reset() function is called -
- many host adapters cannot do this cleanly, so they do nothing at all.
- To get the command going again, these routines set this bit in the flags
- so that a scsi_request_sense() is executed, and the command starts running
- again */
-
- #define NEEDS_JUMPSTART 0x20
-
- #define SG_NONE 0
- #define SG_ALL 0xff
-
- /* The various choices mean:
- NONE: Self evident. Host adapter is not capable of scatter-gather.
- ALL: Means that the host adapter module can do scatter-gather,
- and that there is no limit to the size of the table to which
- we scatter/gather data.
- Anything else: Indicates the maximum number of chains that can be
- used in one scatter-gather request.
- */
-
- /*
- The Scsi_Host_Template type has all that is needed to interface with a SCSI
- host in a device independant matter. There is one entry for each different
- type of host adapter that is supported on the system.
- */
-
- typedef struct
- {
- /*
- The name pointer is a pointer to the name of the SCSI
- device detected.
- */
-
- char *name;
-
- /*
- The detect function shall return non zero on detection,
- indicating the number of host adapters of this particular
- type were found. It should also
- initialize all data necessary for this particular
- SCSI driver. It is passed the host number, so this host
- knows where the first entry is in the scsi_hosts[] array.
-
- Note that the detect routine MUST not call any of the mid level
- functions to queue commands because things are not guaranteed
- to be set up yet. The detect routine can send commands to
- the host adapter as long as the program control will not be
- passed to scsi.c in the processesing of the command. Note
- especially that scsi_malloc/scsi_free must not be called.
- */
-
- int (* detect)(int);
-
- /*
- The info function will return whatever useful
- information the developer sees fit.
- */
-
- const char *(* info)(void);
-
- /*
- The command function takes a target, a command (this is a SCSI
- command formatted as per the SCSI spec, nothing strange), a
- data buffer pointer, and data buffer length pointer. The return
- is a status int, bit fielded as follows :
- Byte What
- 0 SCSI status code
- 1 SCSI 1 byte message
- 2 host error return.
- 3 mid level error return
- */
-
- int (* command)(Scsi_Cmnd *);
-
- /*
- The QueueCommand function works in a similar manner
- to the command function. It takes an additional parameter,
- void (* done)(int host, int code) which is passed the host
- # and exit result when the command is complete.
- Host number is the POSITION IN THE hosts array of THIS
- host adapter.
- */
-
- int (* queuecommand)(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
-
- /*
- Since the mid level driver handles time outs, etc, we want to
- be able to abort the current command. Abort returns 0 if the
- abortion was successful. If non-zero, the code passed to it
- will be used as the return code, otherwise
- DID_ABORT should be returned.
-
- Note that the scsi driver should "clean up" after itself,
- resetting the bus, etc. if necessary.
- */
-
- int (* abort)(Scsi_Cmnd *, int);
-
- /*
- The reset function will reset the SCSI bus. Any executing
- commands should fail with a DID_RESET in the host byte.
- The Scsi_Cmnd is passed so that the reset routine can figure
- out which host adapter should be reset, and also which command
- within the command block was responsible for the reset in
- the first place. Some hosts do not implement a reset function,
- and these hosts must call scsi_request_sense(SCpnt) to keep
- the command alive.
- */
-
- int (* reset)(Scsi_Cmnd *);
- /*
- This function is used to select synchronous communications,
- which will result in a higher data throughput. Not implemented
- yet.
- */
-
- int (* slave_attach)(int, int);
- /*
- This function determines the bios parameters for a given
- harddisk. These tend to be numbers that are made up by
- the host adapter. Parameters:
- size, device number, list (heads, sectors, cylinders)
- */
-
- int (* bios_param)(int, int, int []);
-
- /*
- This determines if we will use a non-interrupt driven
- or an interrupt driven scheme, It is set to the maximum number
- of simulataneous commands a given host adapter will accept.
- */
- int can_queue;
-
- /*
- In many instances, especially where disconnect / reconnect are
- supported, our host also has an ID on the SCSI bus. If this is
- the case, then it must be reserved. Please set this_id to -1 if
- your settup is in single initiator mode, and the host lacks an
- ID.
- */
-
- int this_id;
-
- /*
- This determines the degree to which the host adapter is capable
- of scatter-gather.
- */
-
- short unsigned int sg_tablesize;
-
- /*
- True if this host adapter can make good use of linked commands.
- This will allow more than one command to be queued to a given
- unit on a given host. Set this to the maximum number of command
- blocks to be provided for each device. Set this to 1 for one
- command block per lun, 2 for two, etc. Do not set this to 0.
- You should make sure that the host adapter will do the right thing
- before you try setting this above 1.
- */
-
- short cmd_per_lun;
- /*
- present contains counter indicating how many boards of this
- type were found when we did the scan.
- */
-
- unsigned char present;
- /*
- true if this host adapter uses unchecked DMA onto an ISA bus.
- */
- unsigned unchecked_isa_dma:1;
- } Scsi_Host_Template;
-
- /*
- The scsi_hosts array is the array containing the data for all
- possible <supported> scsi hosts. This is similar to the
- Scsi_Host_Template, except that we have one entry for each
- actual physical host adapter on the system, stored as a linked
- list. Note that if there are 2 aha1542 boards, then there will
- be two Scsi_Host entries, but only 1 Scsi_Host_Template entries.
- */
-
- struct Scsi_Host
- {
- struct Scsi_Host * next;
- volatile unsigned char host_busy;
- char host_no; /* Used for IOCTL_GET_IDLUN */
- int last_reset;
- struct wait_queue *host_wait;
- Scsi_Cmnd *host_queue;
- Scsi_Host_Template * hostt;
-
- /* These parameters should be set by the detect routine */
- unsigned char *base;
- short unsigned int io_port;
- unsigned char irq;
- unsigned char dma_channel;
- /*
- The rest can be copied from the template, or specifically
- initialized, as required.
- */
-
- int this_id;
- short unsigned int sg_tablesize;
- unsigned unchecked_isa_dma:1;
- int hostdata[0]; /* Used for storage of host specific stuff */
- };
-
- extern struct Scsi_Host * scsi_hostlist;
-
- extern Scsi_Host_Template scsi_hosts[];
-
- /*
- scsi_init initializes the scsi hosts.
- */
-
-
- unsigned int scsi_init(unsigned long memory_start,unsigned long memory_end);
- extern struct Scsi_Host * scsi_register(int i, int j);
- extern void scsi_unregister(struct Scsi_Host * i, int j);
-
- #define BLANK_HOST {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
- #endif
-